package resources;

import java.sql.SQLException;
import java.sql.Connection;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.apache.log4j.Logger;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import utilities.Costanti;
import connectors.DBManager;

/*
 * Risorsa REST per permettere ai client di passare in modalita' online verificando la disponibilità di connessione
 
 * occorre fare un POST HTPP all'indirizzo http://91.226.109.144/GestioneMulteServer/login
 * per eseguire un nuovo login
 */

@Path("/login")
public class LoginResource {
		
		static Logger logger = Logger.getLogger(LoginResource.class);		

		@POST
		@Produces(MediaType.APPLICATION_JSON)
		@Consumes(MediaType.APPLICATION_JSON)
		public JSONObject effettuaLogin(JSONObject datiRicevuti){
			
			logger.info("Ricevuta una nuova richiesta di Login");
			// 
			//codice per il calcolo tempo esecuzione
			//			
			long inizio = System.currentTimeMillis();
			long fine = 0;
			long inizioDB = 0;
			long fineDB = 0;
	
	      	JSONObject jsonToReturn = new JSONObject();
	      	boolean errore = false;
	      	DBManager dBmanager = null;
	      	Connection con = null;
	      	String esito = "";
	      	String matricola = "";
			String codice_agente = "";
			String imei = "";
			
	      	//inizializzo i campi dell'oggetto JSON di risposta
	      	try{
				jsonToReturn.put("esito_operazione", HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
				jsonToReturn.put("codice_errore","");
				jsonToReturn.put("info","");
				jsonToReturn.put("tsFE",-1);
				jsonToReturn.put("tsBE",-1);
	      		
	      	}catch(JSONException je){}
			
		    //parsing dei dati ricevuti
			try{
				matricola = datiRicevuti.getString("matricola_agente");
				codice_agente = datiRicevuti.getString("codice_agente");
				imei = datiRicevuti.getString("IMEI");
				
			}catch(JSONException e) {
				errore = true;
				try{
			      	jsonToReturn.put("codice_errore",Costanti.PARSING_DATA_ERROR);
			      	jsonToReturn.put("info","Errore nell'elaborazione dell'oggetto JSON ricevuto: "+e.getMessage());
				}catch(JSONException je){}
				
				logger.error("Errore nella elaborazione dell'oggetto JSON ricevuto: "+e.getMessage());
			}
      	
	      	if(!errore){
				//Verifica attraverso il DB le credenziali dell'utente
				dBmanager = DBManager.getDBManager();				
				if((con = dBmanager.connect())!=null){
					try{
						inizioDB = System.currentTimeMillis();//codice per il calcolo ts
						esito = dBmanager.login(con,matricola,codice_agente,imei);
						fineDB = System.currentTimeMillis();//codice per il calcolo ts
					}			
					catch(SQLException se) {
						errore = true;
						try{
					      	jsonToReturn.put("codice_errore",Costanti.SQL_ERROR);
					      	jsonToReturn.put("info","Errore nell'esecuzione della query SQL: "+se.getMessage());
						}catch(JSONException je){}
						logger.error("Errore nell'esecuzione della query SQL: "+se.getMessage());
					}
					catch(Exception ex){
						errore = true;
						try{
					      	jsonToReturn.put("codice_errore",Costanti.GENERIC_ERROR);
					      	jsonToReturn.put("info","Errore: "+ex.getMessage());
						}catch(JSONException je){}
						logger.error("Errore: "+ex.getMessage());
					}
					finally{
						if(dBmanager != null)	dBmanager.disconnect(con);
					}
				}
				else{
					errore = true;
					try{
				      	jsonToReturn.put("codice_errore",Costanti.DB_CONNECTION_ERROR);
				      	jsonToReturn.put("info","Errore nella connessione al DB server");
					}catch(JSONException je){}
					
			      	logger.error("Errore nella connessione al DB");
				}
				
	
				if(!esito.equals("Successo") && !errore){
					errore = true;
					try{
				      	jsonToReturn.put("esito_operazione", HttpServletResponse.SC_UNAUTHORIZED);
				      	if(esito.equals("Dispositivo non autorizzato"))	 jsonToReturn.put("codice_errore",Costanti.UNKNOWN_DEVICE);
				      	else jsonToReturn.put("codice_errore",Costanti.UNKNOWN_AGENT);
				      	jsonToReturn.put("info","Errore: "+esito);
					}catch(JSONException je){}
					
					logger.info("Operazione non valida: "+esito);			
				}
				if(esito.equals("Successo") && !errore){			
					//
					 //codice per il calcolo tempo esecuzione
					 //
					fine = System.currentTimeMillis();
					long tsBE = fineDB - inizioDB;
					long tsFE = fine - inizio - tsBE;
					try{
				      	jsonToReturn.put("esito_operazione", HttpServletResponse.SC_OK);;
				      	jsonToReturn.put("tsFE",tsFE);
				      	jsonToReturn.put("tsBE",tsBE);
					}catch(JSONException je){}	
					
					logger.info("Effettuato con successo il login dell'agente "+matricola);
				}
	      	}	
			return jsonToReturn;

		}
		

}
